import pandas as pd
import os
import tarfile


def list_tar_files(directory):
    """
    列出指定目录下所有以 .tar 结尾的文件。

    参数:
    directory (str): 需要检查的目录路径。

    返回:
    list: 以 .tar 结尾的文件列表。
    """
    tar_files = [f for f in os.listdir(directory) if f.endswith('.tar.gz')]
    return tar_files

def read_csv_from_tar_gz(tar_file):
    """
    从多个 tar.gz 压缩包中读取 CSV 文件，并将其加载为 pandas DataFrame。

    参数:
    tar_files (list): 包含 tar.gz 文件路径的列表。

    返回:
    list: 包含所有读取的 DataFrame 的列表。
    """
    # dataframes = []

    # for tar_file in tar_files:
    # 确保文件存在且是 .tar.gz 格式
    if not os.path.isfile(tar_file) or not tar_file.endswith('.tar.gz'):
        print(f"文件 {tar_file} 不存在或不是 .tar.gz 格式。")
        return None

    with tarfile.open(tar_file, 'r:gz') as tar:
        # 遍历 tar 包中的所有文件
        for member in tar.getmembers():
            # 只处理 CSV 文件
            if member.name.endswith('.csv'):
                # 读取 CSV 文件
                with tar.extractfile(member) as f:
                    
                    df = pd.read_csv(f,  dtype=str, on_bad_lines='skip')
                    df["rt"] = pd.to_numeric(df["rt"], errors='coerce')
                    df = df.dropna()
                    df["rt"]=df["rt"].astype(int)
                    df["timestamp"] = df["timestamp"].astype(int)
                    
                    # dataframes.append(df)
                    # print(df.columns.tolist())
                    # print(f"types:{df.dtypes}")
                    print(f"已读取 {member.name} 的数据。")

    return df

def get_root_dir():
    cur_dir=os.path.dirname(os.path.abspath(__file__))
    root_dir=os.path.dirname(cur_dir)
    return root_dir

def get_dealed_data_dir():
    root_dir=get_root_dir()
    return root_dir+"/data_process/dealed_data"

def get_datas_dir():
    return "/root/autodl-tmp/CallGraph_dataset"

def get_cur_dir():
    return os.path.dirname(os.path.abspath(__file__))

def get_file_list_in_dir(dir_path):
    return [f for f in os.listdir(dir_path) if os.path.isfile(os.path.join(dir_path, f))] 




# start_date="0d11"
# end_date="0d12"
def down_load_dataset(dataset_path, start_date, end_date):
    if os.path.exists(dataset_path):
        print(f"数据集已存在！（{dataset_path}）")
    else:
        print(f"开始下载数据集...")
        command=f"bash fetchData.sh start_date={start_date} end_date={end_date}"
        status=os.system(command)
        if status==0:
            print(f"数据集下载完毕。")
        else:
            print("下载出错！")
            exit(-1)
            
def get_time_str():
    from datetime import datetime

    # 获取当前时间
    now = datetime.now()

    # 格式化为字符串，例如：2025-05-29 14:30:00
    current_time_str = now.strftime("%m-%d-%H-%M-%S")
    return current_time_str

def ensure_directory_exists(path, folder_name):
    """
    检查指定路径下是否存在指定文件夹，如果不存在则创建
    
    Args:
        path (str): 基础路径
        folder_name (str): 文件夹名称
    
    Returns:
        str: 完整的文件夹路径
    
    Example:
        >>> ensure_directory_exists("/home/user", "data")
        '/home/user/data'
    """
    # 构建完整的文件夹路径
    full_path = os.path.join(path, folder_name)
    
    # 检查文件夹是否存在
    if not os.path.exists(full_path):
        try:
            # 创建文件夹（包括父目录）
            os.makedirs(full_path, exist_ok=True)
            print(f"文件夹已创建: {full_path}")
        except OSError as e:
            print(f"创建文件夹失败: {e}")
            return None
    else:
        print(f"文件夹已存在: {full_path}")
    
    return full_path


